/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufjf.posjava.cm.model.DAO;

import br.ufjf.posjava.cm.model.*;
import br.ufjf.posjava.cm.util.GenericDao;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import javax.swing.JOptionPane;

/**
 *
 * @author Filipe
 */
public class ConsultaDAO extends GenericDao<Consulta, Integer> {

    @Override
    public void inserir(Consulta obj) throws ClassNotFoundException, SQLException {
        String sql = "INSERT INTO consulta (id_agenda,id_servico,obs) VALUES (?,?,?)";

        ArrayList<String> lista = new ArrayList<String>();

        lista.add(obj.getAgenda().getIdAgenda().toString());
        lista.add(obj.getServico().getIdServico().toString());
        lista.add(obj.getObs());

        executaDML(sql, lista);
    }

    @Override
    public void alterar(Consulta obj) throws ClassNotFoundException, SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void apagar(Consulta obj) throws ClassNotFoundException, SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public Consulta pesquisarChave(Integer obj) throws ClassNotFoundException, SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public ArrayList<Consulta> buscarTodos() throws ClassNotFoundException, SQLException {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    /**
     * Método que traz as agendas do dentista em questão com Status Agendadas.
     * @param idDentista
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    public ArrayList<Agenda> buscarTodasAgendasAgendadasPorDentista(Integer idDentista) throws ClassNotFoundException, SQLException {
        Paciente paciente;
        Profissional dentista;
        Profissional atendente;
        String sql = "SELECT * FROM agenda WHERE status = 'agendada' AND id_dentista=" + idDentista + " order by data";
        ArrayList<String> lista = new ArrayList<String>();
        ArrayList<Agenda> listaP = new ArrayList<Agenda>();
        ResultSet rs = executaSql(sql, lista);

        while (rs.next()) {
            Agenda a = new Agenda();
            a.setIdAgenda(rs.getInt("id"));

            a.setData(new Date(rs.getTimestamp("data").getTime()));

            paciente = new Paciente();
            paciente.setIdPaciente(rs.getInt("id_paciente"));

            dentista = new Profissional();
            dentista.setIdProfissional(rs.getInt("id_dentista"));

            atendente = new Profissional();
            atendente.setIdProfissional(rs.getInt("id_atendente"));

            a.setStatus(rs.getString("status"));

            a.setPaciente(paciente);
            a.setDentista(dentista);
            a.setAtendente(atendente);

            listaP.add(a);

        }
        return listaP;
    }

    /**
     * Metodo utilizado no consulta.jsp para trazer os procedimentos aplicados anteriormente com dado paciente.
     * @param idDentista
     * @param idPaciente
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    public ArrayList<Consulta> buscarServicoRealizadoPorDentistaNoPaciente(Integer idDentista, Integer idPaciente) throws ClassNotFoundException, SQLException {
        String sql = "select c.id_servico,a.data,a.id_paciente,c.obs from consulta c, agenda a, servico s "
                + "where c.id_servico = s.id "
                + "and a.id = c.id_agenda "
                + "and a.status = 'realizada' "
                + "and a.id_dentista = " + idDentista + " "
                + "and a.id_paciente = " + idPaciente + "";

        ArrayList<String> lista = new ArrayList<String>();
        ArrayList<Consulta> listaConsultas = new ArrayList<Consulta>();
        ResultSet rs = executaSql(sql, lista);

        while (rs.next()) {
            Consulta consulta = new Consulta();
            Agenda a = new Agenda();
            Paciente paciente = new Paciente();
           
            consulta.setServico(new Servico(rs.getInt("c.id_servico")));
            
            a.setData(new Date(rs.getTimestamp("a.data").getTime()));            
            consulta.setAgenda(a);

            paciente.setIdPaciente(rs.getInt("a.id_paciente"));
            a.setPaciente(paciente);
            
            consulta.setAgenda(a);
            
            consulta.setObs(rs.getString("c.obs"));
            
            listaConsultas.add(consulta);

        }
        return listaConsultas;
    }

    /**
     * Metodo utilizado no faturamentoConsulta.jsp para trazer o quanto um determinado dentista faturou.
     * @param idDentista
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    public ArrayList<Consulta> buscarServicoRealizadoPorDentista(Integer idDentista) throws ClassNotFoundException, SQLException {
        String sql = "select c.id_servico,a.data,a.id_paciente from consulta c, agenda a, servico s "
                + "where c.id_servico = s.id "
                + "and a.id = c.id_agenda "
                + "and a.status = 'realizada' "
                + "and a.id_dentista = " + idDentista + "";

        ArrayList<String> lista = new ArrayList<String>();
        ArrayList<Consulta> listaConsultas = new ArrayList<Consulta>();
        ResultSet rs = executaSql(sql, lista);

        while (rs.next()) {
            Consulta consulta = new Consulta();
            Agenda a = new Agenda();
            Paciente paciente = new Paciente();
            
            //1
            consulta.setServico(new Servico(rs.getInt("c.id_servico")));
            
            //2
            a.setData(new Date(rs.getTimestamp("a.data").getTime()));            
            consulta.setAgenda(a);

            //3
            paciente.setIdPaciente(rs.getInt("a.id_paciente"));
            a.setPaciente(paciente);
            
            //conclusão
            consulta.setAgenda(a);
            
            listaConsultas.add(consulta);

        }
        return listaConsultas;
    }
    
    /**
     * Este método traz o faturamento por periodo desejado.
     * @param idDentista
     * @param dataInicio
     * @param dataFim
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    public ArrayList<Consulta> buscarServicoPorData(Integer idDentista, Date dataInicio, Date dataFim) throws ClassNotFoundException, SQLException {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
        String dataIn = dateFormat.format(dataInicio);
        String dataFn = dateFormat.format(dataFim);
        
        String sql = "select c.id_servico,a.data,a.id_paciente from consulta c, agenda a, servico s "
                + "where c.id_servico = s.id "
                + "and a.id = c.id_agenda "
                + "and a.status = 'realizada' "
                + "and a.data BETWEEN '"+dataIn+"' and '"+dataFn+"' "
                + "and a.id_dentista = "+idDentista+"";
        
        ArrayList<String> lista = new ArrayList<String>();
        ArrayList<Consulta> listaConsultas = new ArrayList<Consulta>();
        ResultSet rs = executaSql(sql, lista);

        while (rs.next()) {
            Consulta consulta = new Consulta();
            Agenda a = new Agenda();
            Paciente paciente = new Paciente();
                        
            consulta.setServico(new Servico(rs.getInt("c.id_servico")));
                        
            a.setData(new Date(rs.getTimestamp("a.data").getTime()));            
            consulta.setAgenda(a);

            paciente.setIdPaciente(rs.getInt("a.id_paciente"));
            a.setPaciente(paciente);
            
            consulta.setAgenda(a);
            
            listaConsultas.add(consulta);

        }
        return listaConsultas;
    }

    /**
     * Este método impede o dentista de realizar a msm consulta duas vezes.
     * @param idAgenda
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    public void alterarStatusDeAgenda(Integer idAgenda) throws ClassNotFoundException, SQLException {
        String sql = "UPDATE agenda SET status = ? where id = " + idAgenda + "";

        Agenda agenda = new Agenda();
        ArrayList<String> lista = new ArrayList<String>();

        agenda.setStatus("realizada");
        lista.add(agenda.getStatus());

        executaDML(sql, lista);
    }

    /**
     * Busca da consulta refinada pelo nome do paciente.
     * @param idDentista
     * @param idPaciente
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    public ArrayList<Agenda> buscarConsultaPeloNome(Integer idDentista, String nomePaciente) throws ClassNotFoundException, SQLException  {
        String sql = "SELECT a.id, a.data, a.id_paciente, a.id_dentista, a.id_atendente, a.status FROM agenda a, paciente p "
                + "WHERE a.status = 'agendada'"
                + "AND a.id_paciente = p.id "
                + "AND a.id_dentista = "+idDentista+" "
                + "AND p.nome LIKE '%"+nomePaciente+"%'order by data";
        Paciente paciente;
        Profissional dentista;
        Profissional atendente;
        ArrayList<String> lista = new ArrayList<String>();
        ArrayList<Agenda> listaP = new ArrayList<Agenda>();
        ResultSet rs = executaSql(sql, lista);

        while (rs.next()) {
            Agenda a = new Agenda();
            a.setIdAgenda(rs.getInt("a.id"));

            a.setData(new Date(rs.getTimestamp("a.data").getTime()));

            paciente = new Paciente();
            paciente.setIdPaciente(rs.getInt("a.id_paciente"));

            dentista = new Profissional();
            dentista.setIdProfissional(rs.getInt("a.id_dentista"));

            atendente = new Profissional();
            atendente.setIdProfissional(rs.getInt("a.id_atendente"));

            a.setStatus(rs.getString("a.status"));

            a.setPaciente(paciente);
            a.setDentista(dentista);
            a.setAtendente(atendente);

            listaP.add(a);

        }
        return listaP;
    }
    
    /**
     * Busca da consulta refinada pela data.
     * @param idDentista
     * @param idPaciente
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException 
     */
    public ArrayList<Agenda> buscarConsultaPelaData(Integer idDentista, Date data) throws ClassNotFoundException, SQLException  {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        String dataStr = dateFormat.format(data);
                
        String sql = "SELECT a.id, a.data, a.id_paciente, a.id_dentista, a.id_atendente, a.status FROM agenda a, paciente p "
                + "WHERE a.status = 'agendada'"
                + "AND a.id_paciente = p.id "              
                + "AND a.data BETWEEN '"+dataStr+" "+"00:00:00"+"' "
                + "AND '"+dataStr+" "+"23:59:59"+"'"
                + "AND a.id_dentista = "+idDentista+" order by data";
        Paciente paciente;
        Profissional dentista;
        Profissional atendente;
        ArrayList<String> lista = new ArrayList<String>();
        ArrayList<Agenda> listaP = new ArrayList<Agenda>();
        ResultSet rs = executaSql(sql, lista);

        while (rs.next()) {
            Agenda a = new Agenda();
            a.setIdAgenda(rs.getInt("a.id"));

            a.setData(new Date(rs.getTimestamp("a.data").getTime()));

            paciente = new Paciente();
            paciente.setIdPaciente(rs.getInt("a.id_paciente"));

            dentista = new Profissional();
            dentista.setIdProfissional(rs.getInt("a.id_dentista"));

            atendente = new Profissional();
            atendente.setIdProfissional(rs.getInt("a.id_atendente"));

            a.setStatus(rs.getString("a.status"));

            a.setPaciente(paciente);
            a.setDentista(dentista);
            a.setAtendente(atendente);

            listaP.add(a);

        }
        return listaP;
    }

}
